# define _CRT_SECURE_NO_WARNINGS 1；
#include<stdio.h>
int map[4][4] = { 2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5, };
/*1,2判断
if (*p[i] == *(p[i] + 1))//判断第一个与第二个
		{//1
			*p[i] = *p[i] + *(p[i] + 1);
			*(p[i] + 1) = 0;}							*/
/*1,3判断
if (*p[i] == *(p[i] + 2))//判断新第一个与第三个
			{//2
				*p[i] = *p[i] + *(p[i] + 2);
				*(p[i] + 2) = 0;	*/
/*1,4判断if (*(p[i]) == *(p[i] + 3))
						{
							*(p[i]) = *(p[i]) + *(p[i] + 3);
							*(p[i] + 3) = 0;										//新的第一列第一个数于第四个数相同相加赋给第一个,第四个数变为0
						}*/
/*2,3判断
if (*(p[i] + 1) == *(p[i] + 2))//判断第二个与第三个
					{//15
						*(p[i] + 1) = *(p[i] + 2);
						*(p[i] + 2) = 0;			*/
/*2,4判断
if (*(p[i] + 1) == *(p[i] + 3))//判断新第二个与第四个
				{//8
					*(p[i] + 1) = *(p[i] + 3);
					*(p[i] + 3) = 0;*/
/*3,4判断
if (*(p[i] + 2) == *(p[i] + 3))
				{//9
					*(p[i] + 2) = *(p[i] + 2) + *(p[i] + 3);
					*(p[i] + 3) = 0;	*/

void SynthesisA(int(*p)[4])
{
	for (int i = 0; i < 4; i++) 
	{
		if (*p[i] == *(p[i] + 1))//判断第一个与第二个
		{//1
			*p[i] = *p[i] + *(p[i] + 1);
			*(p[i] + 1) = 0;														//第一列第一个数于第二个数相同相加赋给第一个,第二个数变为0
			if (*p[i] == *(p[i] + 2))//判断新第一个与第三个
			{//2
				*p[i] = *p[i] + *(p[i] + 2);
				*(p[i] + 2) = 0;													//新第一列第一个数于第三个数相同相加赋给第一个,第三个数变为0
				if (*(p[i]) == *(p[i] + 3))//判断第一个与第四个
				{//3
					*(p[i]) = *(p[i]) + *(p[i] + 3);
					*(p[i] + 3) = 0;												//新第一列第一个数于第四个数相同相加赋给第一个,第四个数变为0
				}//3
				else
				{
					;//不同就不判断了
				}
			}//2
			else//新第一个与第三个不同判断第三个与第四个
			{//2 2
				if (*(p[i] + 2) == *(p[i] + 3))//判断第三个与第四个
				{//3
					*(p[i] + 2) = *(p[i] + 2) + *(p[i] + 3);
					*(p[i] + 3) = 0;												//新第一列第三个数于第四个数相同相加赋给第三个,第四个数变为0
					if(*p[i] == *(p[i] + 2))//判断新第一个与第三个
					{//4
						*p[i] = *p[i] + *(p[i] + 2);
						*(p[i] + 2) = 0;											//新第一列第一个数于第三个数相同相加赋给第一个,第三个数变为0
					}//4
					else
					{//4 4
						;//不用判断了
					}//4 4
				}//3
				else//第三个与第四个不同
				{//33
					;//不用判断了
				}//33
			}//2 2
		}//1

		else//第一个与第二个不同 判断第二个与第三个
		{//1 1
			if (*(p[i] + 1) == *(p[i] + 2))//判断第二个与第三个
			{//5
				*(p[i] + 1) = *(p[i] + 2);
				*(p[i] + 2) = 0;												//第一列第二个数于第三个数相同相加赋给第二个,第三个数变为0
				if (*(p[i] + 1) == *(p[i] + 3))//判断新第二个与第四个
				{//6
					*(p[i] + 1) = *(p[i] + 3);
					*(p[i] + 3) = 0;											//第一列第二个数于第四个数相同相加赋给第二个,第四个数变为0
					if (*p[i] == *(p[i] + 1))//判断第一个与第二个
					{//7
						*p[i] = *p[i] + *(p[i] + 1);
						*(p[i] + 1) = 0;										//第一列第一个数于第二个数相同相加赋给第一个,第二个数变为0
					}//7
					else
					{//7 7
						;//第一个与第二个不同不用判断了
					}//7 7
				}//6
				else//新第二个与第四个不同判断第一个与第二个
				{//6 6
					if (*p[i] == *(p[i] + 1))//判断第一个与第二个
					{//8
						*p[i] = *p[i] + *(p[i] + 1);
						*(p[i] + 1) = 0;										//第一列第一个数于第二个数相同相加赋给第一个,第二个数变为0
						if (*(p[i]) == *(p[i] + 3))//第一个与第二个相同判断第一个与第四个
						{//9
							*(p[i]) = *(p[i]) + *(p[i] + 3);
							*(p[i] + 3) = 0;										//新的第一列第一个数于第四个数相同相加赋给第一个,第四个数变为0
						}//9
						else//第一个与第四个不同
						{//9 9
							;//不用判断
						}//9 9
					}//8
					else //第一个与第二个不同
					{//8 8
						;//不用判断
					}//8 8
				}//6 6
			}//5
			else//第二个与第三个不同判断第三个与第四个
			{//5 5
				if (*(p[i] + 2) == *(p[i] + 3))//判断第三个与第四个
				{//10
					*(p[i] + 2) = *(p[i] + 2) + *(p[i] + 3);
					*(p[i] + 3) = 0;											//第一列第三个数于第四个数相同相加赋给第三个,第四个数变为0
					if (*(p[i] + 1) == *(p[i] + 2))//第三个与第四个相同判断第二个与第三个
					{//11
						*(p[i] + 1) = *(p[i] + 2);
						*(p[i] + 2) = 0;										//第一列第二个数于第三个数相同相加赋给第二个,第三个数变为0
						if(*p[i] == *(p[i] + 1))//判断第一个与第二个
						{//12
							*p[i] = *p[i] + *(p[i] + 1);
							*(p[i] + 1) = 0;									//第一列第一个数于第二个数相同相加赋给第一个,第二个数变为0
						}//12
						else//第一个与第二个不同
						{//12 12
							;//不用判断
						}//12 12
					}//11
					else//第二个与第三个不同
					{//11 11
						;//不用判断
					}//11 11
				}//10
				else//第三个与第四个不同
				{//10 10
					;//不用判断
				}//10 10
			}//5 5
		}//2 2
	}
}
int main()
{
	SynthesisA(map);
	SynthesisA(map);
	SynthesisA(map);
	int i, j;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("%d  ", map[i][j]);

		}
		printf("\n");
	}
	return 0;
}